package com.voicenews.aggregator;

import java.net.URISyntaxException;
import java.sql.SQLException;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import com.voicenews.model.Article;
import com.voicenews.model.DAO;
import com.voicenews.model.Feed;
import com.voicenews.pushnews.ArticlesToUsersSender;

/**
 * @author nguyenthechu1990@gmail.com
 * 
 *         Lớp này được sử dụng để thu thập các Article tin tức từ các website
 *         tin tức Các article được thu thập từ các Feed của website
 * 
 */
public class Aggregator {

	/**
	 * @param args
	 * @throws URISyntaxException
	 */
	public static void main(String[] args) throws URISyntaxException {
		try {
			addArticleToDatabase();
		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
	}

	public static void addArticleToDatabase() throws SQLException {

		Timer timer = new Timer();
		TimerTask doAsynchronuosTask = new TimerTask() {

			@SuppressWarnings("deprecation")
			@Override
			public void run() {

				DAO dao = new DAO();
				HashMap<Long, List<Article>> idTopicAndArticles = new HashMap<Long, List<Article>>();
				List<Feed> feeds = dao.getFeeds();
				List<Article> articles = new ArrayList<Article>();
				for (int i = 0; i < feeds.size(); i++) {
					Feed feed = feeds.get(i);
					System.out.println(feed.getUrl());
					RSSHandler feedParser = new RSSHandler();
					articles = feedParser.getLatestArticles(feed.getUrl(),
							String.valueOf(feed.getLastRefreshTime()));
					// save news to database
					articles = SaveNewsToDatabaseHandler.saveToDatabase(dao, articles,
							feed.getId());
					if (articles.size() != 0
							&& articles.get(0).getPubDate() != null) {
						feed.setLastRefreshTime(new Date(articles.get(0)
								.getPubDate()).getTime());
						dao.updateFeed(feed);
					}

					if (articles.size() != 0) {
						List<Article> tmp = idTopicAndArticles.get(feed
								.getIdTopic());
						if (tmp == null) {
							idTopicAndArticles.put(feed.getIdTopic(), articles);
						} else {
							articles.addAll(tmp);
							idTopicAndArticles.put(feed.getIdTopic(), articles);
						}
					}
					articles = null;
					seperator("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

				}

				// Gui cac tin tuc vua thu thap duoc den nguoi dung, nhung nguoi
				// da dang ky nhan tin
				// tu dong truoc do
				ArticlesToUsersSender sender = new ArticlesToUsersSender();
				sender.sendArticlesToUser(idTopicAndArticles);
			}
		};

		timer.schedule(doAsynchronuosTask, 0, 600000);

	}

	public static void seperator(String s) {
		System.out
				.println("------------------------------------------------------------------------------------------");
		System.out.println(s);
	}

	public static String RemoveAccents(String input) {
		return new String(Normalizer.normalize(input, Normalizer.Form.NFC));
	}

}
